// 使用闭包实现命令模式
// 命令模式：把请求封装成对象，从而分离请求的发起者 与 请求的执行者之间的耦合关系。在命令被执行之前，可以预想往命令对象中植入命令的接收者
/* 
    // 使用对象的形式 实现命令模式
    var Tv = {
        open: function() {
            console.log('打开')
        },

        close: function() {
            console.log('关闭')
        }
    }

    var Commands = function(receiver) {
        this.receiver = receiver;
    };

    Commands.prototype.execute = function() {
        this.receiver.open();
    }

    Commands.prototype.undo = function() {
        this.receiver.close();
    }

    var setCommands = function(command) {
        document.getElementById('execute').onclick = function() {
            command.execute();
        };

        document.getElementById('undo').onclick = function() {
            command.undo();
        }
    }
    setCommands(new Commands(Tv));


    // // 面向对象实现命令模式
    // var Tv = function() {
    //     this.state = false;
    // };

    // // 封装请求的执行者
    // Tv.prototype = {
    //     open: function() {
    //         this.state = true;
    //         console.log('电视一打开')
    //     },

    //     close: function() {
    //         this.state = false;
    //         console.log('电视一关闭')
    //     }
    // };

    // // 封装请求发起者
    // var Commands = function(receiver) {
    //     this.receiver = receiver;
    // };

    // Commands.prototype = {
    //     execute: function() {
    //         this.receiver.open()
    //     },

    //     undo: function() {
    //         this.receiver.close();
    //     }
    // }

    // var setCommands = function(command) {
    //     document.getElementById('execute').onclick = function() {
    //         command.execute();
    //     };

    //     document.getElementById('undo').onclick = function() {
    //         command.undo();
    //     };
    // };

    // setCommands(new Commands(new Tv()));
 */

 // 以闭包的形式实现 命令模式 （part_2-2中面向对象与闭包的关系一样）

 var Tv = {
    open: function() {
        console.log('open')
    },

    close: function() {
        console.log('close')
    }
}

var createCommands = function(receiver) {
    var execute = function() {
        receiver.open();
    };

    var undo = function() {
        receiver.close();
    };

    return {
       execute: execute,
       undo: undo
    }
}

var setCommands = function(commands) {
    document.getElementById('execute').onclick = function() {
        commands.execute();
    };

    document.getElementById('undo').onclick = function() {
        commands.undo();
    }
}

setCommands(createCommands(Tv));




